/***************************************************************************
创建者：田昱民
 开始时间：               : 2016.12.01
 copyright            : (C) 华友高科
 修改说明：（每次有修改就添加一条，带有 修改人，修改时间，修改描述）

 ***************************************************************************
*   电机状态窗口程序
*                                                                         *
 ***************************************************************************/
#ifndef MOTORSTATUSVIEW_H
#define MOTORSTATUSVIEW_H

#include <QVector>
#include <QWidget>
#include <QTimer>
#include <QPoint>
#include <QRubberBand>
#include <QStatusBar>
#include <QStandardItemModel>
#include "includePlot/qcustomplot.h"
#include "MacroDefine/GeneralDefine.h"
#include <QQueue>

#define D_ROBOT_AXIS_MAX 7

class DomParser;

namespace Ui {
class MotorStatusView;
}

/**
 * @brief The MotorStatusView class　电机状态类
 */
class MotorStatusView : public QWidget
{
    Q_OBJECT
public:
    explicit MotorStatusView(PingPongBuffer *pingPongBufferIn, int jointNumber, int robotId, bool isAutoSaveWaveIn
                             , QWidget *parent=0);
    ~MotorStatusView();

public:
    int clearMessage();
    int saveWaveDataToFile(QString filePath);
    int openRecordFile(QString filePathIn);
    int plotFileWave();
    int plotInnerWave();
    int plotWave(QQueue<MathDataInfo> *mathDataQueueIn);
    int setDebugFlag(int debugFlagIn);
    int startWave();
    int ceaseWave();
    int stopWave_delay();
    int resetPlot();

    /**
     * @brief updateMotorStatusView     更新表格内容信号函数
     */
    void updateMotorStatusView();
    /**
     * @brief updateView                更新界面显示信号函数
     */
    void updateView();
    /**
     * @brief initGraphView             初始化界面格式
     */
    void initGraphView();

    void update();
    void receiveWaveData(bool isPlot);



    void changeLanguage();
    void setViewText();


signals:
    /**
     * @brief showMotorStatus　显示表格内容信号函数
     */
    void showMotorStatus();
    /**
     * @brief startWaveForm　开始波形图
     */
    void startWaveForm();
    /**
     * @brief ceaseWaveForm　停止波形图
     */
    void ceaseWaveForm();



private slots:
    void on_pushButton_clicked();//开始

    void on_pushButton_2_clicked();//暂停

    void on_pushButton_3_clicked();//清除

    void mousePress(QMouseEvent* mevent);

    void mouseMove(QMouseEvent* mevent);

    void mouseRelease(QMouseEvent* mevent);


    void on_horizontalSlider_sliderMoved(int position);
    void on_verticalSlider_sliderMoved(int position);

    void on_pushButton_4_clicked();

    void timeroutslot();


private:
    int saveMathDataToJsonFile(QQueue<MathDataInfo> *mathDataQueue,QString filePath);
    int saveMathDataToXmlFile(QQueue<MathDataInfo> *mathDataQueue,QString filePath);
    int saveMathDataToHuayouFile(QQueue<MathDataInfo> *mathDataQueue,QString filePath);
    int initial_forXmlFile(QString xmlLogFileNameIn);
    int saveOneMathDataToXmlFile(DomParser *domParser,MathDataInfo log);
    int readMathDataFromXmlFile(QString filePath,QQueue<MathDataInfo> &mathDataQueue);
    int readMathDataFromHuayouFile(QString filePath,QQueue<MathDataInfo> &mathDataQueue);
    int readMathDataFromJsonFile(QString filePath,QQueue<MathDataInfo> &mathDataQueue);
    void addOneTimeData(MathDataInfo mathDataIn, bool isValid, int plotIndex, int dataType, int axisNumber,
                        double magnification, int isDiffChecked);
    void setButtonStyle(int flag);

public:
    /**
     * @brief position　位置
     */
    QVector<int> position;
    /**
     * @brief velocity　速度
     */
    QVector<int> velocity;
    /**
     * @brief torque　力距
     */
    QVector<int> torque;
    /**
     * @brief followOffset　误差
     */
    QVector<int> followOffset;
    /**
     * @brief power　功率
     */
    QVector<int> power;
    /**
     * @brief positionMax　位置最大值
     */
    QVector<int> positionMax;
    /**
     * @brief velocityMax　速度最大值
     */
    QVector<int> velocityMax;
    /**
     * @brief torqueMax　力距最大值
     */
    QVector<int>  torqueMax;
    /**
     * @brief followOffsetMax　误差最大值
     */
    QVector<int> followOffsetMax;
    /**
     * @brief powerMax　功率最大值
     */
    QVector<int> powerMax;
    /**
     * @brief value　数据值
     */
    QVector<double> value0;     //电机位置
    QVector<double> value1;     //速度
    QVector<double> value2;     //力矩
    QVector<double> value3;     //跟随误差
    QVector<double> value4;     //功率

    QVector<double> valueMax0;  //最大位置
    QVector<double> valueMax1;  //最大速度
    QVector<double> valueMax2;  //最大力矩
    QVector<double> valueMax3;  //最大误差
    QVector<double> valueMax4;  //最大功率

    int axisCount;
    int graphFlag;
    double mainKey;

    double minYAxis;
    double maxYAxis;

    double clickedX;
    double clickedY;

    QStandardItemModel  *model;

    QVector<double> maxValue;
    QVector<double> minValue;

private:
    Ui::MotorStatusView *ui;
    /**
     * @brief rubberBand　橡皮筋选框
     */
    QRubberBand *rubberBand;
    /**
     * @brief rubberOrigin　点击位置
     */
    QPoint rubberOrigin;

    PingPongBuffer *pingPongBuffer;
    QQueue<MathDataInfo> *mathDataQueue;
    QQueue<MathDataInfo> *mathDataQueue_file;
    int maxDataQueueSize;
    QString recordFilePath;

    QTimer *timer;

    int plotFlag;
    int debugFlag;
    double validMaxDataLength;
    int delayCount;//延迟暂停计时
    int delayCountMax;
    bool isDelayStop;
    bool isForAgv;
    bool isAutoSaveWave;
    bool isReceiveInnerWaveData;

};

#endif // MOTORSTATUSVIEW_H
